// 3.了解GPS相关知识
//     $GPRMC协议格式
// 　　例：$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,0,0,A*50,
// 　　字段0：$GPRMC，语句ID，表明该语句为Recommended t2imum Specific GPS/TRANSIT Data（RMC）推荐最小定位信息
// 　　字段1：UTC时间，hhmmss.sss格式(UTC时间是世界统一时间，中国的时间是UTC+8，比如：上面的时间是02:48:13而中国的时间是10:48:13)
// 　　字段2：状态，A=定位，V=未定位
// 　　字段3：纬度ddmm.mmmm，度分格式（前导位数不足则补0） 
// 　　字段4：纬度N（北纬）或S（南纬）
// 　　字段5：经度dddmm.mmmm，度分格式（前导位数不足则补0）
// 　　字段6：经度E（东经）或W（西经）
// 　　字段7：速度，节，Knots
// 　　字段8：方位角，度
// 　　字段9：UTC日期，DDMMYY格式
// 　　字段10：磁偏角，（000 - 180）度（前导位数不足则补0）
// 　　字段11：磁偏角方向，E=东W=西
// 　　字段16：校验值

#include <stdio.h>
#include <string.h>

/*
推荐最小定位信息:$GPRMC
中国时间: 10:48:13
状态：定位
纬度 3158.4608
北纬
经度 11848.3737
东经
速度 10.05Knots
方位角 324.27度
中国时间: 06年07月15日
磁偏角0
磁偏角方向0
校验值A*50
*/

#define GPS "$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,0,0,A*50"

int main(int argc, char **argv)
{
    char str[128] = GPS;
    char *str_buf[50] = {str};
    int i = 0;
    int t1 = 0;
    int t2 = 0;
    int t3 = 0;

    // 字符串分割
    while ((str_buf[i] = strtok(str_buf[i], ",")) && ++i)
        /*do nothing*/;

    // 分析协议数据
    i = 0;
    while (str_buf[i] != NULL)
    {
        switch(i)
        {
            case 0:
                printf("推荐最小定位信息:%s\n", str_buf[i]);
                break;
            case 1:
                // 解包
                sscanf(str_buf[i], "%2d%2d%2d.", &t1, &t2, &t3);
                //printf("%d %d %d\n", t1, t2, t3);

                // 处理解析数据
                t1 += 8;
                if (t1 >= 24)
                {
                    printf("中国时间：下一天 %02d:%02d:%02d\n", t1 % 24, t2, t3);
                }
                else 
                {
                    printf("中国时间: %02d:%02d:%02d\n", t1, t2, t3);
                }
                break;
            case 2:
                if (strcmp(str_buf[i], "A") == 0)
                {
                    printf("状态：定位\n");
                }
                else if (strcmp(str_buf[i], "V") == 0)
                {
                    printf("状态：未定位\n");
                }
                break;
            case 3:
                printf("纬度 %s\n", str_buf[i]);
                break;
            case 4:
                if (strcmp(str_buf[i], "N") == 0)
                {
                    printf("北纬\n");
                }
                else if (strcmp(str_buf[i], "S") == 0)
                {
                    printf("南纬\n");
                }
                break;
            case 5:
                printf("经度 %s\n", str_buf[i]);
                break;
            case 6:
                if (strcmp(str_buf[i], "E") == 0)
                {
                    printf("东经\n");
                }
                else if (strcmp(str_buf[i], "W") == 0)
                {
                    printf("西经\n");
                }
                break;
            case 7:
                printf("速度 %sKnots\n", str_buf[i]);
                break;
            case 8:
                printf("方位角 %s度\n", str_buf[i]);
                break;
            case 9:
                // 解包
                sscanf(str_buf[i], "%2d%2d%2d.", &t1, &t2, &t3);
                //printf("%d %d %d\n", t1, t2, t3);

                // 处理解析数据
                printf("中国时间: %02d年%02d月%02d日\n", t3, t2, t1);
                
                break;
            case 10:
                printf("磁偏角%s\n", str_buf[i]);
                break;
            case 11:
                printf("磁偏角方向%s\n", str_buf[i]);
                break;
            case 12:
                printf("校验值%s\n", str_buf[i]);
                break;
            default:
                break;
        }
        i++;
    }
    
    return 0;
}